/**
 * Console Banner - 在控制台打印版权信息
 * 使用多重保护机制，确保在任何情况下都能打印，且不暴露调用来源
 */

const INFO = {
  version: "1.1.1",
  author: "adnaan-ui",
  description: "现代化 React UI 组件库",
  repository: "https://gitee.com/adnaan/adnaan-ui",
};

// ============================================================================
// 原始 console 方法备份（防止被重写拦截）
// ============================================================================
const ORIGINAL_CONSOLE = (() => {
  if (typeof window === "undefined" || typeof console === "undefined") {
    return null;
  }

  // 尝试获取原始的 console 方法
  try {
    // 方法1: 直接保存（最原始的方法）
    const original = {
      log: console.log.bind(console),
      info: console.info?.bind(console) || console.log.bind(console),
      warn: console.warn?.bind(console) || console.log.bind(console),
    };

    // 验证是否是原始方法（检查 toString）
    if (
      original.log.toString().includes("[native code]") ||
      original.log.toString().includes("native")
    ) {
      return original;
    }

    // 方法2: 从全局对象重新获取（防止被替换）
    const consoleObj = (window as any).console || (globalThis as any).console;
    if (consoleObj) {
      return {
        log: consoleObj.log?.bind(consoleObj) || console.log.bind(console),
        info: consoleObj.info?.bind(consoleObj) || console.log.bind(console),
        warn: consoleObj.warn?.bind(consoleObj) || console.log.bind(console),
      };
    }
  } catch {
    // 忽略错误
  }

  return null;
})();

// ============================================================================
// 安全的打印函数（隐藏调用栈）
// ============================================================================

/**
 * 创建一个匿名函数来隐藏调用栈
 * 使用 Function 构造器创建的函数无法追踪调用来源
 */
const createAnonymousLogger = (() => {
  try {
    // 使用 Function 构造器创建匿名函数，完全隐藏调用栈
    // 注意：这种方式在某些严格模式下可能被禁用，需要 fallback
    const AnonymousLog = new Function(
      "msg",
      "styles",
      "originalConsole",
      `
      try {
        if (originalConsole && originalConsole.log) {
          if (styles && styles.length > 0 && Array.isArray(styles)) {
            originalConsole.log.apply(originalConsole, [msg].concat(styles));
          } else {
            originalConsole.log.call(originalConsole, msg);
          }
        }
      } catch (e) {
        // 静默失败
      }
    `
    );

    return (msg: string, styles?: string[], consoleObj?: any) => {
      try {
        AnonymousLog(msg, styles, consoleObj || ORIGINAL_CONSOLE);
      } catch {
        // 如果 Function 构造器失败，使用 fallback
      }
    };
  } catch {
    // Fallback: 使用立即执行函数包装 + setTimeout 延迟执行（进一步隐藏调用栈）
    return (msg: string, styles?: string[], consoleObj?: any) => {
      setTimeout(() => {
        (() => {
          try {
            const logger = consoleObj || ORIGINAL_CONSOLE || console;
            if (styles && styles.length > 0) {
              logger.log(msg, ...styles);
            } else {
              logger.log(msg);
            }
          } catch {
            // 静默失败
          }
        })();
      }, 0);
    };
  }
})();

// ============================================================================
// 多重降级打印方案
// ============================================================================

/**
 * 尝试多种方式打印，确保一定能输出
 */
const safePrint = (msg: string, styles?: string[]): void => {
  if (typeof window === "undefined") {
    return;
  }

  // 方案1: 使用原始 console（最佳方案）
  try {
    if (ORIGINAL_CONSOLE?.log) {
      if (styles && styles.length > 0) {
        ORIGINAL_CONSOLE.log(msg, ...styles);
      } else {
        ORIGINAL_CONSOLE.log(msg);
      }
      return;
    }
  } catch {
    // 继续尝试其他方案
  }

  // 方案2: 使用匿名函数隐藏调用栈
  try {
    createAnonymousLogger(msg, styles, ORIGINAL_CONSOLE);
    return;
  } catch {
    // 继续尝试其他方案
  }

  // 方案3: 直接使用当前 console（可能被重写，但总比没有好）
  try {
    if (styles && styles.length > 0) {
      console.log(msg, ...styles);
    } else {
      console.log(msg);
    }
    return;
  } catch {
    // 继续尝试其他方案
  }

  // 方案4: 使用 console.info 或 console.warn
  try {
    const logger =
      ORIGINAL_CONSOLE?.info ||
      ORIGINAL_CONSOLE?.warn ||
      console.info ||
      console.warn;
    if (logger) {
      logger(msg);
      return;
    }
  } catch {
    // 继续尝试其他方案
  }

  // 方案5: 使用 DOM 元素显示（最后的降级方案，当所有 console 方法都失败时）
  try {
    if (
      typeof document !== "undefined" &&
      document.createElement &&
      document.body
    ) {
      const text = msg.replace(/%c/g, "").replace(/\s+/g, " ").trim();
      const style = document.createElement("style");
      style.textContent = `
        #__adnaan_ui_banner__ {
          position: fixed;
          top: 0;
          left: 0;
          background: #fff;
          padding: 10px;
          z-index: 999999;
          font-family: monospace;
          font-size: 12px;
        }
      `;
      document.head.appendChild(style);
      const div = document.createElement("div");
      div.id = "__adnaan_ui_banner__";
      div.textContent = text;
      document.body.appendChild(div);
      setTimeout(() => {
        div.remove();
        style.remove();
      }, 3000);
    }
  } catch {
    // 所有方案都失败了
  }
};

// ============================================================================
// 主函数
// ============================================================================

/**
 * 在控制台打印版权信息横幅
 * 使用多重保护机制，确保在任何情况下都能打印
 */
export function printConsoleBanner(): void {
  // 检查是否在浏览器环境
  if (typeof window === "undefined") {
    return;
  }

  // 检查是否已打印过（避免重复打印）
  const key = "__ADNAAN_UI_BANNER_PRINTED__";
  if ((window as any)[key]) {
    return;
  }
  (window as any)[key] = true;

  // 样式定义
  const brandStyle =
    "background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);" +
    "color: #ffffff;" +
    "padding: 8px 16px;" +
    "border-radius: 4px 0 0 4px;" +
    "font-weight: 600;" +
    "font-size: 14px;" +
    "text-shadow: 0 1px 2px rgba(0,0,0,0.2);";

  const versionStyle =
    "background: #f0f0f0;" +
    "color: #333;" +
    "padding: 8px 12px;" +
    "border-radius: 0 4px 4px 0;" +
    "font-size: 13px;" +
    "font-weight: 500;";

  const linkStyle =
    "color: #667eea;" +
    "font-size: 13px;" +
    "text-decoration: underline;" +
    "margin-left: 8px;";

  const descStyle = "color: #666; font-size: 12px; font-style: italic;";

  // 使用安全打印函数打印横幅
  safePrint(`%c ${INFO.author} %c v${INFO.version} %c ${INFO.repository}`, [
    brandStyle,
    versionStyle,
    linkStyle,
  ]);

  // 打印描述信息
  safePrint(`%c💎 ${INFO.description}`, [descStyle]);
}

export default printConsoleBanner;
